package com.zhaolaobao.redis.service;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

/**
 * @ClassName RedisService
 * @Description //
 * @Author WHX
 * @Date 2020/9/2 14:53
 **/
public interface RedisService {

    boolean expire(String key, long time);

    long getExpire(String key);

    boolean hasKey(String key);

    void del(String... key);

    /**
     * ===============================String(字符串)=============================
     */

    <T> T get(String key);

    Set<String> keys(String key);

    <T> Set<T> values(String key);

    boolean set(String key, Object value);

    boolean set(String key, Object value, long time);

    long incr(String key, long delta);

    long decr(String key, long delta);

    /**
     * ================================Hash(哈希)=================================
     */

    <T> T  hget(String key, String item);

     <K, V>  Map<K, V> hmget(String key);

    boolean hmset(String key, Map<String, Object> map);

    boolean hmset(String key, Map<String, Object> map, long time);

    boolean hset(String key, String item, Object value);

    boolean hset(String key, String item, Object value, long time);

    void hdel(String key, Object... item);

    boolean hHasKey(String key, String item);

    double hincr(String key, String item, double by);

    double hdecr(String key, String item, double by);

    /**
     * ===============================Set(集合)=============================
     */

    <T> Set<T> sGet(String key);

    boolean sHasKey(String key, Object value);

    long sSet(String key, Object... values);

    long sSetAndTime(String key, long time, Object... values);

    long sGetSetSize(String key);

    long setRemove(String key, Object... values);

    /**
     * ===============================ZSet（集合）=================================
     */

    Boolean zsAdd(String key, Object value, double score);

    <T> Set<T> zsRangeByScore(String key, double min, double max);

    Long zsRemove(String key, Object... values);

    /**
     * ===============================List(列表)=================================
     */

    <T> List<T> lGet(String key, long start, long end);

    long lGetListSize(String key);

    <T> T lGetIndex(String key, long index);

    boolean lSet(String key, Object value);

    boolean lSet(String key, Object value, long time);

    boolean lSet(String key, List<Object> value);

    boolean lSet(String key, List<Object> value, long time);

    boolean lUpdateIndex(String key, long index, Object value);

    long lRemove(String key, long count, Object value);


    /**
     * ===============================Lua脚本=================================
     */

    /**
     * 特别注意事项，由于序列化问题，使用lua存储value的时候记得加上""号
     * @param luaScriptPath
     * @param resultTypeClass
     * @param keys
     * @param args
     * @return
     * @Exception
     * 1.org.springframework.data.redis.RedisSystemException: Redis exception; nested exception is io.lettuce.core.RedisException: java.lang.IllegalStateException
     * 原因resultTypeClass错误，比如：lua返回0，resultTypeClass=String.class就会出现这种问题
     * 2.返回结果为空，如果返回结果是字符串，resultTypeClass=Long.class无法接收字符串
     */
    <T> T execute(String luaScriptPath, Class resultTypeClass, List<String> keys,Object... args);

    /**
     * 特别注意事项，由于序列化问题，使用lua存储value的时候记得加上""号
     * @param resultTypeClass
     * @param luaScript
     * @param keys
     * @param args
     * @return
     * @Exception
     * 1.org.springframework.data.redis.RedisSystemException: Redis exception; nested exception is io.lettuce.core.RedisException: java.lang.IllegalStateException
     * 原因resultTypeClass错误，比如：lua返回0，resultTypeClass=String.class就会出现这种问题
     * 2.返回结果为空，如果返回结果是字符串，resultTypeClass=Long.class无法接收字符串
     */
    <T> T execute(Class resultTypeClass, String luaScript, List<String> keys, Object... args);
}
